ASI 是 JavaScript 自動插入分號的機制,當 JavaScript 語句沒有加上分號時,則會受到自動插入分號 (ASI) 規則影響
以下是幾種常見 ASI 規則:
當執行 continue、break、return... 語句,語句後會自動加上分號
function fn() {
return
'我是第一名'
}
console.log(fn()) // undefined
function fn() {
return; '我是第一名';
}
console.log(fn()); // undefined
function fn() {
return '我是第一名';
}
console.log(fn()); // 我是第一名
當 JavaScript 語句'後一行'接到'前一行'會發生語法錯誤時,會自動加上分號
此例中雖未使用大括號包裹 if else 語句
,但 ASI 有正確在每行結尾將分號加上
if (1>2) a=1
else a=2
console.log(a) // 2
if (1>2) a=1;
else a=2;
console.log(a); // 2
若將 else
移至與 if
同一行,因 else
並未與 if
做分隔,則會出現執行上的錯誤訊息
if (1>2) a=1 else a=2
console.log(a)
// Uncaught SyntaxError: Unexpected token 'else'
若改將 console.log
移至與 else
同一行,因 else
並未與 console.log
做分隔,所以也會出現錯誤訊息
if (1>2) a=1
else a=2 console.log(a)
// Uncaught SyntaxError: Unexpected identifier
所以若要放置在同一行,使之正確執行,就要加入分號
if (1>2) a=1; else a=2; console.log(a);
// 2
(
、[
、/
開始新的一行是 (
開始,不發生 ASI 規則,所以 2 個立即函式並沒有隔開,故出現錯誤
(function () {
console.log('我是第一名')
}())
(function () {
console.log('我是第一名')
}())
// 我是第一名
// 我是第一名
// Uncaught TypeError: (intermediate value)(...) is not a function
可以 在立即函式後添加分號
或 在立即函式前添加分號
皆可修正錯誤
// 方法1
(function () {
console.log('我是第一名')
}());
(function () {
console.log('我是第一名')
}());
// 方法2
;(function () {
console.log('我是第一名')
}())
;(function () {
console.log('我是第一名')
}())
新的一行是 (
開始,不發生 ASI 規則,第三行與第二行併在一起,解釋為 函式a 帶入參數 a+b
,但 a
並不是函式所以出現錯誤訊息。
var a = 1
var b = a
(a + b).toString()
// Uncaught TypeError: a is not a function
var a = 1;
var b = a(a + b).toString();
// Uncaught TypeError: a is not a function
此例中 /
,會被解釋成運算符,而非正規表達式,所以錯誤訊息顯示 /
運算符前多了 .
var a = 1
var b = a
/test/.test(b)
// Uncaught SyntaxError: Unexpected token '.'
var a = 1;
var b = a/test/.test(b);
// Uncaught SyntaxError: Unexpected token '.'
var a = 1;
var b = a;
/test/.test(b);
+
、-
、*
、%
開始新的一行以 +
開始,不發生 ASI 規則併入上一行
var a = 2
var b = a
+a
console.log(a, b) // 2 4
var a = 2;
var b = a+a;
console.log(a, b); // 2 4
var a = 2;
var b = a;
+a;
console.log(a, b); // 2 2
,
、.
開始新的一行以 ,
開始,不發生 ASI 規則併入上一行,所以 變數 b
轉為字串
var a = 2
var b = a
.toString()
console.log(typeof a, typeof b) // number string
var a = 2;
var b = a.toString();
console.log(typeof a, typeof b); // number string
新的一行以 ,
開始,不發生 ASI 規則併入上一行,所以 變數 b
一樣有被 var 宣告
var a = 1
,b = 2
console.log(a, b) // 1 2
var a = 1, b = 2;
console.log(a, b); // 1 2